/*
 * @Author: wrdoct llw18729357726@163.com
 * @Date: 2025-04-19 15:59:42
 * @LastEditors: wrdoct llw18729357726@163.com
 * @LastEditTime: 2025-04-19 16:09:22
 * @FilePath: /c-study/exec_test.cpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

// int main()
// {
//     printf("start...\n");               // 打印 "start..." 到标准输出
//     execlp("ls", "-a", "-l", NULL);     // 尝试执行 'ls' 命令，列出所有文件，包括隐藏文件，并以长格式显示
//     printf("never run except wrong\n"); // 如果 execlp 执行成功，这行代码不会被执行
//     return 0;
// }

int main()
{
    const char *command = "-l";
    pid_t pid = fork(); // 创建一个新进程
    if (pid == 0)
    {                                                                          // 如果 pid 为 0，表示当前是子进程
        char *arguments[] = {"/bin/ls", "-a", (char *)command, NULL};          // 构建执行命令的参数数组
        execvp(arguments[0], arguments);                                       // 使用 execvp 执行命令
        printf("Failed to invoke /bin/sh to execute the supplied command.\n"); // 如果 execvp 失败，打印错误信息
        exit(0);                                                               // 退出子进程
    }
    // 父进程
    int status;               // 用于存储子进程的退出状态
    waitpid(pid, &status, 0); // 等待子进程结束
    // 没有学习过如何根据进程退出状态，判断信息
    return WIFEXITED(status) ? WEXITSTATUS(status) : -WTERMSIG(status); // 返回子进程的退出状态或终止信号
}